package Gather.StreamExercise.StreamDome001;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * ClassName:StreamDome011
 * Package:Gather.StreamExercise
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/24-21:16
 * @Version:v1.0
 */
public class StreamDome011 {
    public static void main(String[] args) {
        /*collect(Collector collector)  收集流中的数据,放到集合中*/
        /*
        * 注意：如果我们要收集到Map集合当中,键不能重复,否则会报错*/
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1, "张无忌-男-15","周芷若-女-29","张强-男-14",
                "张三丰-男-100","赵敏-女-29", "张翠山-男-38", "张良-男-40", "王二麻子-男-37", "谢广坤-男-58");
        /*需求：把所有男性收集起来*/
        //收集到List集合当中
        List<String> newList1 = list1.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
        System.out.println(newList1);
        //收集到Set集合当中
        Set<String> newList2 = list1.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());
        System.out.println(newList2);
        //收集到Map集合当中
        //谁作为键,谁作为键
        //把所有男性收集起来,键--姓名,值--年龄
        //toMap中写键的规则,值的规则
        Map<String, Integer> map = list1.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                //Function<String, Object>第一个泛型表示流里面数据类型,第二个泛型表示流里面键的类型
                /*方法apply形参：依次表示流里面的每一个数据
                 *               方法体：生成键的代码
                 *               返回值：已经生成的键*/
                /*
                 * toMap:参数一表示键的生成规则
                 *       参数二表示值的生成规则*/
                .collect(Collectors.toMap(new Function<String, String>() {

                    @Override
                    public String apply(String s) {
                        return s.split("-")[0];
                    }
                    //Function<String, Object>第一个泛型表示流里面数据类型,第二个泛型表示流里面值的类型
                    /*方法apply形参：依次表示流里面的每一个数据
                     *               方法体：生成值的代码
                     *               返回值：已经生成的值*/
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {

                        return Integer.parseInt(s.split("-")[2]);
                    }
                }));
        System.out.println(map);


        Map<String, Integer> map2 = list1.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(
                        s -> s.split("-")[0],
                        s -> Integer.parseInt(s.split("-")[2])));
        System.out.println(map2);
    }
}
